﻿/**
 * Copyright (C) 2012 original author and authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NGuice.Inject.Spi;

namespace NGuice.Inject.Internal
{
    //complete!
    /// <summary>
    /// 内部上下文对象，用于标识注入并支持循环依赖
    /// </summary>
    public sealed class InternalContext
    {
        private IDictionary<object, ConstructionContext> constructionContexts = new Dictionary<object, ConstructionContext>();

        private Dependency dependency;

        public ConstructionContext<T> GetConstructionContext<T>(object key)
        {
            ConstructionContext<T> constructionContext = constructionContexts.ContainsKey(key) ?  constructionContexts[key] as ConstructionContext<T> : null;
            if (constructionContext == null)
            {
                constructionContext = new ConstructionContext<T>();
                constructionContexts.Add(key, constructionContext);
            }
            return constructionContext;
        }

        public Dependency Dependency
        {
            get
            {
                return dependency;
            }
        }

        public Dependency SetDependency(Dependency dependency)
        {
            Dependency previous = this.dependency;
            this.dependency = dependency;
            return previous;
        }
    }
}
